Skip to content

S01-22 JavaSE-项目:多用户即时通信系统

[TOC]

项目演示

  • 功能包括:用户登录、拉取在线用户列表、私聊、群聊、发文件、服务器推送新闻
  • 界面支持:登录菜单、二级操作菜单、在线用户展示、聊天记录显示

项目开发流程

  1. 需求分析:明确功能需求(登录、聊天、文件传输等)
  2. 设计阶段:UML类图、流程图、模块设计、数据库设计(使用HashMap模拟)
  3. 实现阶段:按模块开发功能
  4. 测试阶段:单元测试、集成测试
  5. 实施阶段:部署运行
  6. 维护阶段:bug修复、功能升级

核心功能

  1. 用户登录(模拟数据库:HashMap存储用户信息)
  2. 拉取在线用户列表
  3. 无异常退出(客户端、服务端)
  4. 私聊(点对点通信)
  5. 群聊(向所有在线用户发送消息)
  6. 发文件(点对点文件传输)
  7. 服务器推送新闻(群发系统消息)

功能实现-用户登录

核心思路

  • 客户端:输入用户名/密码,发送登录请求
  • 服务端:验证用户信息,验证通过则记录在线用户,返回登录成功
  • 数据传输:使用对象流(Message类)封装数据

关键代码框架

java
// Message类(封装通信数据)
class Message implements Serializable {
    private int type; // 消息类型:登录、私聊、群聊等
    private String sender; // 发送者
    private String getter; // 接收者
    private String content; // 消息内容
    private String sendTime; // 发送时间
    // getter/setter
}

// 服务端登录处理
class ServerConnectClientThread extends Thread {
    private Socket socket;
    private String uid; // 客户端用户id
    
    @Override
    public void run() {
        while (true) {
            try {
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message msg = (Message) ois.readObject();
                if (msg.getType() == MessageType.MESSAGE_LOGIN) {
                    // 验证用户信息
                    String uid = msg.getSender();
                    String pwd = msg.getContent();
                    if ("100".equals(uid) && "123456".equals(pwd)) {
                        // 登录成功,添加到在线用户列表
                        Server.onlineUsers.put(uid, socket);
                        // 返回登录成功消息
                        Message response = new Message();
                        response.setType(MessageType.MESSAGE_LOGIN_SUCCEED);
                        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                        oos.writeObject(response);
                    } else {
                        // 登录失败
                        // ...
                    }
                }
                // 其他消息类型处理
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

功能实现-拉取在线用户列表

核心思路

  • 客户端:发送拉取在线用户请求
  • 服务端:遍历在线用户列表,返回给客户端
  • 客户端:接收并显示在线用户

功能实现-私聊

核心思路

  • 客户端:输入接收者id和消息内容,发送私聊请求
  • 服务端:根据接收者id查找对应的Socket,转发消息
  • 接收端:接收并显示私聊消息

功能实现-群聊

核心思路

  • 客户端:输入群聊消息,发送群聊请求
  • 服务端:遍历所有在线用户的Socket,转发消息
  • 所有在线客户端:接收并显示群聊消息

功能实现-发文件

核心思路

  • 客户端:输入接收者id、文件路径,读取文件字节数组,发送文件请求
  • 服务端:根据接收者id查找Socket,转发文件数据
  • 接收端:接收文件字节数组,保存到本地

功能实现-服务器推送新闻

核心思路

  • 服务端:启动独立线程,定时或手动发送系统消息
  • 遍历所有在线用户的Socket,群发推送消息
  • 客户端:接收并显示推送消息

扩展功能

  1. 离线留言:用户未在线时,消息存储到服务器,登录后推送
  2. 离线发文件:用户未在线时,文件存储到服务器,登录后推送